/********引脚接口*********
		VCC		5V/3.3V
		GND		GND
		SCL 	P10
		CS  	P11
		SDA 	P16
		BL		无
		K1 		P37
		K2 		P36
		K3 		P35
		K4 		P34
		BU 		P17
***************************/
#include "config.h"
#include "GPIO.h"
#include "delay.h"
#include "timer.h"
#include "MAX7219.h"
#include "Exti.h"


/*
	Key 按键键值
	xianshi 设置/正常模式
	K1_num 设置位数
	jiajian 正计时/倒计时
*/
u8 Key,xianshi,K1_num,num,jiajian;
u16 min=0,sec=0;//正常计数分/秒
u16 minS=0,secS=0;//设置数据分/秒

void main(void)
{	
	Key_Init();//按键检测初始化
	LED_Init();//
	MAX7019_Init();//MAX7219芯片初始化
	Timer0_config();//定时器0初始化
	Timer2_config();
	MAX7019_Col();//MAX7219清屏
	min = minS;//将设置的分钟赋值给min
	sec = secS;//将设置的秒复制给shc
	ET0 = 0;//关闭定时器计时
	while(1)
	{	
		Key = KeyNum();//键值刷新检测
		if(Key==1)//设置时间
		{
			jiajian=0;//倒计时还是正计时
			xianshi=1;//进入设置时间模式
			K1_num++;//位数加加
			if(K1_num==5)//因为只有4位计数，故位数限制位4
			{
				K1_num=0;
				xianshi=0;//退出设置时间模式
				min = minS;//刷新新设置的分钟
				sec = secS;//刷新新设置的秒钟
			}
		}
/********正计时倒计时切换******************************************************************************************************************************************************************************************/		
		if(xianshi == 0 && Key == 2 && min == 0 && sec == 0)
		{
			P33=0;
			jiajian = ~jiajian;//计时标志位切换
			if(jiajian==0)
			{
				P33=1;
			}
			else
			{
				P33=0;
			}
		}
		if(Key==3)
		{
/***********查看当前是多少位时钟加减，进行对应的加**************************************************************************************************************************************************************************************/			
			if(K1_num==1){minS = minS+10;}
			if(K1_num==2){minS = minS+1;}
			if(K1_num==3){secS = secS+10;}
			if(K1_num==4){secS = secS+1;}
		}
		
/********开始/关闭******************************************************************************************************************************************************************************************/
		if(xianshi==0 && Key==3)
		{
			ET0 = ~ET0;//定时器开始-开/关
		}
/**********查看当前是多少位时钟加减，进行对应的加****************************************************************************************************************************************************************************************/
		if(Key==4)
		{
			if(K1_num==1){minS = minS-10;}
			if(K1_num==2){minS = minS-1;}
			if(K1_num==3){secS = secS-10;}
			if(K1_num==4){secS = secS-1;}
		}
/********防止在设置时间时误启动******************************************************************************************************************************************************************************************/		
		if(xianshi==0 && Key==4)//归为计数
		{
			ET0 = 0;//关闭计时
			min = minS;//重新赋值分钟
			sec = secS;//重新赋值秒种
			P17=1;//关闭指示引脚
		}
/********锁主，在设置时间时不允许计时******************************************************************************************************************************************************************************************/		
		if(xianshi!=0)
		{
			P17=1;
			ET0 = 0;
		}
	}
}

void timer0_int(void) interrupt TIMER0_VECTOR
{
	static unsigned int T0Count;
	T0Count++;
	if(T0Count >= 460)//1S计时
	{
		T0Count=0;
/*******倒计时**********************************************************************************************************************************************************************************************/
		if(jiajian == 0)
		{
			if(sec==0)//当一次秒为0后
			{
				//当时分都为零便将定时器计时关闭，将指示引脚开启
				if(min==0){ET0=0;min = minS;sec = secS;P17=0;}
				sec=59;//重置59
				min=min-1;//如何jiang分钟减1
			}
			else
			{
				sec--;//秒减1S
			}
		}
		else
		{
/*******时分秒正计时，越界判断*******************************************************************************************************************************************************************************************/
			sec++;
			if(sec >= 59)
			{
				sec=0;
				min++;
				if(min == 99)
				{
					ET0 = 0;
					P17=0;
				}
			}
		}

	}
}

void timer2_int(void) interrupt TIMER2_VECTOR
{
	static unsigned int T2Count;
	T2Count++;
	if(T2Count >= 100)//100ms刷新
	{
		num=~num;
		T2Count=0;
/*********设置时间显示*****************************************************************************************************************************************************************************************/
		if(xianshi==1)
		{
		/****刷新设置时间显示**********************************************************************************************************************************************************************************************/
			Max7219_WCmd(1,minS/10);
			Max7219_WCmd(2,minS%10);
			Max7219_WCmd(3,secS/10);
			Max7219_WCmd(4,secS%10);
			if(num !=0)
			{
				if(K1_num==1){Max7219_WCmd(1,0XFF);}
				if(K1_num==2){Max7219_WCmd(2,0XFF);}
				if(K1_num==3){Max7219_WCmd(3,0XFF);}
				if(K1_num==4){Max7219_WCmd(4,0XFF);}
			}
			else
			{
				if(K1_num==1){Max7219_WCmd(1,minS/10);}
				if(K1_num==2){Max7219_WCmd(2,minS%10);}
				if(K1_num==3){Max7219_WCmd(3,secS/10);}
				if(K1_num==4){Max7219_WCmd(4,secS%10);}
			}
		}
/*******刷新时钟分秒显示**********************************************************************************************************************************************************************************************/
		else
		{
			Max7219_WCmd(1,min/10);
			Max7219_WCmd(2,min%10);
			Max7219_WCmd(3,sec/10);
			Max7219_WCmd(4,sec%10);
		}

	}
}
